int son[N][31];
int cnt[N];
int idx=0;  //给节点分配id的：遇到没出现在Trie中的元素，就给新出现的元素分配一个属于他的id

void insert_trie(string str)
{
    // cout << str<<endl;
    int p=0;
    for(int i=0;i<str.size();i++)
    {
        int tmp=str[i]-'a';
        if(son[p][tmp]==0)    son[p][tmp]=++idx;

        p = son[p][tmp];  //p 此时指向的是当前 处理的元素
    }
    cnt[p]++;  
}

int count_num_trie(string str)
{
    int p=0;
    for(int i=0;i<str.size();i++)
    {
        int tmp=str[i]-'a';

        if(son[p][tmp]==0)      return 0;
        else p=son[p][tmp];
    }
    return cnt[p];
}

int main()
{
    int n;
    string op;
    string str;
    cin>>n;
    while(n--)
    {
        cin>>op>>str;
        if(op=="I")
            insert_trie(str);
        else
            cout<<count_num_trie(str)<<endl;
    }

}
//在给定的 N个整数 A1，A2……AN中选出两个进行 xor(异或）运算，得到的结果最大是多少？
int son[N * 31][2];
int idx=0;

void insert_trie(int x)
{
    // cout << str<<endl;
    int p=0;
    for(int i = 30; i >= 0; i --)
    {
        int u = (x >> i) & 1;
        if(!son[p][u]) son[p][u] = ++ idx;
        p = son[p][u];
    }
}
int search(int x)
{
    int p = 0;
    int res = 0;
    for(int i = 30; i >= 0; i --)
    {
        int u = (x >> i) & 1;
        if(son[p][!u]) 
        {
            p = son[p][!u];
            res = res * 2 + 1;//乘以二相当于左移1位
        }
        else
        {
            p = son[p][u];
            res = res * 2;
        }
    }
    return res;
}

void solve()
{
    int n;
    cin >> n;
    std::vector<int> arr(n + 10);
    for(int i = 1; i <= n; i ++)
    {
        int x;
        cin >> x;
        arr[i] = x;
        insert_trie(x);
    }
    int res = 0;
    for(int i = 1; i <= n ;i ++)
    {
        res = max(res,search(arr[i]));
    }
    cout << res << endl;
}
